package com.wkg.lotterysystem.controller.handler;


import com.wkg.lotterysystem.common.errorcode.GlobalErrorCodeConstants;
import com.wkg.lotterysystem.common.exception.ControllerException;
import com.wkg.lotterysystem.common.exception.ServiceException;
import com.wkg.lotterysystem.common.pojo.CommonResult;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;


/**
 * 全局异常处理类
 * 统一捕获并处理控制器层抛出的各种异常，返回标准化的错误响应
 */
@RestControllerAdvice // 声明该类为全局异常处理器，结合了@ControllerAdvice和@ResponseBody，可与返回JSON格式
public class GlobalExceptionHandler {

    private static final Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);

    /**
     * 处理业务逻辑异常
     * @param e 捕获到的ServiceException异常对象
     * @return 通用错误响应结果
     * @apiNote 服务层抛出的业务异常处理
     */
    @ExceptionHandler(value = ServiceException.class)
    public CommonResult<?> serviceException(ServiceException e) {
        // 记录错误日志（包含异常堆栈）
        logger.error("业务逻辑异常:", e);
        // 构造并返回错误响应
        return CommonResult.error(
                GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),
                e.getMessage()
        );
    }

    /**
     * 处理控制器层异常
     * @param e 捕获到的ControllerException异常对象
     * @return 通用错误响应结果
     * @apiNote 控制器层参数校验等异常处理
     */
    @ExceptionHandler(value = ControllerException.class)
    public CommonResult<?> controllerException(ControllerException e) {
        // 记录错误日志（包含异常堆栈）
        logger.error("控制器层异常:", e);
        // 构造并返回错误响应
        return CommonResult.error(
                GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),
                e.getMessage()
        );
    }

    /**
     * 处理未捕获的系统异常
     * @param e 捕获到的Exception异常对象
     * @return 通用错误响应结果
     * @apiNote 兜底异常处理，捕获所有未被特定处理的异常
     */
    @ExceptionHandler(value = Exception.class)
    public CommonResult<?> exception(Exception e) {
        // 记录错误日志（包含异常堆栈）
        logger.error("未处理的系统异常:", e);
        // 构造并返回错误响应
        return CommonResult.error(
                GlobalErrorCodeConstants.INTERNAL_SERVER_ERROR.getCode(),
                "系统繁忙，请稍后再试"
        );
    }
}
